package gutils

import (
	"errors"
	"math"
)

// CeilInt 计算两个无符号整数相除的向上取整结果。
//
// 参数:
//   - a: 被除数
//   - b: 除数
//
// 返回值:
//   - int: 向上取整后的整数结果
//
// 示例:
//
//	result := CeilInt(5, 2) // 返回 3
//	result := CeilInt(4, 2) // 返回 2
func CeilInt(a, b uint) int {
	return int(math.Ceil(float64(a) / float64(b)))
}

// CeilUint 计算两个无符号整数相除的向上取整结果，返回无符号整数。
//
// 参数:
//   - a: 被除数
//   - b: 除数
//
// 返回值:
//   - uint: 向上取整后的无符号整数结果
//
// 示例:
//
//	result := CeilUint(5, 2) // 返回 3
//	result := CeilUint(4, 2) // 返回 2
func CeilUint(a, b uint) uint {
	return uint(math.Ceil(float64(a) / float64(b)))
}

// CeilInt64 计算两个无符号整数相除的向上取整结果，返回64位整数。
//
// 参数:
//   - a: 被除数
//   - b: 除数
//
// 返回值:
//   - int64: 向上取整后的64位整数结果
//
// 示例:
//
//	result := CeilInt64(5, 2) // 返回 3
//	result := CeilInt64(4, 2) // 返回 2
func CeilInt64(a, b uint) int64 {
	return int64(math.Ceil(float64(a) / float64(b)))
}

// CeilUint64 计算两个无符号整数相除的向上取整结果，返回64位无符号整数。
//
// 参数:
//   - a: 被除数
//   - b: 除数
//
// 返回值:
//   - uint64: 向上取整后的64位无符号整数结果
//
// 示例:
//
//	result := CeilUint64(5, 2) // 返回 3
//	result := CeilUint64(4, 2) // 返回 2
func CeilUint64(a, b uint) uint64 {
	return uint64(math.Ceil(float64(a) / float64(b)))
}

// Calculate absolute value
// AbsInt 计算整数的绝对值。
//
// 参数:
//   - n: 输入的整数
//
// 返回值:
//   - int: 输入整数的绝对值
//
// 示例:
//
//	result := AbsInt(-5) // 返回 5
//	result := AbsInt(3)  // 返回 3
func AbsInt(n int) int {
	if n < 0 {
		return -n
	}
	return n
}

// Calculate absolute value
// AbsInt64 计算64位整数的绝对值。
//
// 参数:
//   - n: 输入的64位整数
//
// 返回值:
//   - int64: 输入整数的绝对值
//
// 示例:
//
//	result := AbsInt64(-5) // 返回 5
//	result := AbsInt64(3)  // 返回 3
func AbsInt64(n int64) (int64, error) {
	if n < 0 {
		if n == -9223372036854775808 {
			return 0, errors.New("int64 overflow")
		}
		return -n, nil
	}
	return n, nil
}
